#include "socketUnix.h"

int obtenerSocketUnixDeConsola (char* path)
{
	int socketPPD, socketConsola, longPPD, longConsola;
	struct sockaddr_un dirPPD;//direccion Servidor
	struct sockaddr_un dirConsola;//dir Cliente
	struct sockaddr* ptrPPD;
	struct sockaddr* ptrConsola;
	char comando[30];//socketPPD vendria a ser el Servidor
		     	 	 // y socketConsola el Cliente

	signal ( SIGCHLD, SIG_IGN );

	ptrPPD = ( struct sockaddr* ) &dirPPD;
	longPPD = sizeof ( dirPPD );
	ptrConsola = ( struct sockaddr* ) &dirConsola;
	longConsola = sizeof ( dirConsola );
	socketPPD = socket ( AF_UNIX, SOCK_STREAM, PROTOCOLO );

	dirPPD.sun_family = AF_UNIX;    //tipo de dominio

	strcpy ( dirPPD.sun_path, "/home/utn_so/fichero" );  // nombre
	unlink ( path );
	bind ( socketPPD, ptrPPD, longPPD );   // crea el fichero

	puts ("\n estoy a la esperaaaaa \n");//tendria q ser un log
	listen ( socketPPD, 1 );//solo necesita 1 conexion

	socketConsola = accept ( socketPPD, ptrPPD, &longPPD );
	puts ("\n acepto la conexion \n");//tendria q ser un log

	return socketConsola;

}

//Recibe el "sockPath" para vincular un socket al mismo. En caso de exito devuelve el socket ya conectado y listo para enviar info.
int conectarSocketUnixDeConsola(const char *sockPath)
{
        //Variables locales
    int socketPPD, longSocketPPD, resultadoConexion;
    struct sockaddr_un dirSocketPPD;

    //Obtiene un socket libre
    if ((socketPPD = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
    {
        perror("socket");
        exit(1);
    }

    //Lo conecta al destino
    dirSocketPPD.sun_family = AF_UNIX;
    strcpy(dirSocketPPD.sun_path, sockPath);
    longSocketPPD = strlen(dirSocketPPD.sun_path) + sizeof(dirSocketPPD.sun_family);

    do
    {
    	resultadoConexion = connect(socketPPD, (struct sockaddr *)&dirSocketPPD, longSocketPPD);
    	if (resultadoConexion == -1) {
    		perror("connect");
    		sleep(1);//Espero 1 segundo y reintento conectarme
    	}
    }while (resultadoConexion == -1);

    return socketPPD;
}


/*************leeLinea ( df, cad )******************/
leeLinea ( int df, char *cad )
{
int n;
do
{
n = read ( df, cad, 1 );/* lectura de un caracter */
}
while ( n > 0 && *cad++ != NULL );/* lee hasta NULL o fin entrada */

return ( n > 0 ); /* devuelve falso si fin de entrada */

}
